TJCLCounter - VYSOKA nepresnost hodnot

Otázka od: Karel Kimes

17. 9. 2002 17:34

ahoj,
mam problem s presnosti TJCLCounter. Dival sem se, ze tento objekt vyuziva
QueryPerformanceFrequency a QueryPerformanceCounter.
QueryPerformanceFrequency mne vraci frekvenci 3579454 (Hz), ALE!!!


procedure TForm1.Btn_MeasureClick(Sender: TObject);
begin
   FCounter.Start;
   Sleep(5000); // 5s
   ShowMessage(FloatToStr(FCounter.Stop)); // ******* ---> zobrazi hodnotu
od 0,882... do 0,889...
end;

nebo

procedure TForm1.Btn_MeasureClick(Sender: TObject);
begin
   FCounter.Start;
   Sleep(60000); // 60s
   ShowMessage(FloatToStr(FCounter.Stop)); // ******* ---> zobrazi
hodnotu 10,336...
end;


Zajimave je, ze "rozdilovy pomer"   (ufff, co sem to vyplodil, doufam, ze
fsichni pochopite, co tim myslim), tedy KONSTANTA = HODNOTA_SLEEP /
NAMERENA_HODNOTA, se jevi jako konstantni. Konstantu sem spocetl zhruba na
cca 5,805.
Proc mne to nevraci uplynuly cas v [s]? Proc musim vysledek nasobit touto
konstantou, ktera (NENI ODZKOUSENO), se muze na ruznych PC lisit?


Mj. zkousel sem to napsat i takhle a vysledek byl stejnej.

procedure TForm1.Btn_MeasureClick(Sender: TObject);
var
   freq, start_time, end_time : Int64;
begin
   if not QueryPerformanceFrequency(freq) then
     RaiseLastOSError;

   if not QueryPerformanceCounter(start_time) then
     RaiseLastOSError;

   Sleep(5000);

   if not QueryPerformanceCounter(end_time) then
     RaiseLastOSError;

   ShowMessage(FloatToStr((end_time - start_time) / freq));
end;


WinXP, D6PRO UPDATE 02

kchodl

Odpovedá: Delphin

19. 9. 2002 13:00

QueryPerformanceFrequency a QueryPerformanceCounter pouziva specialni hw
prostredky, ktere mohou byt ruzne na kazdem typu procesoru a zrejme ne pro
vsechny to funguje spravne. Na Celeronu 1 GHz je vysledek po sleep(5000)
4.98... .

Odpovedá: Vaclav Sazima

19. 9. 2002 14:20

 Ja bych cekal spis nepresnost toho Sleepu, uz z toho, co vlastne dela.
  Vaclav Sazima

Delphin wrote:
>
> QueryPerformanceFrequency a QueryPerformanceCounter pouziva specialni hw
> prostredky, ktere mohou byt ruzne na kazdem typu procesoru a zrejme ne pro
> vsechny to funguje spravne. Na Celeronu 1 GHz je vysledek po sleep(5000)
> 4.98... .